/**========================================================================*
 *=========================================================================*
 *
 * @file                Flugzeug.java
 *
 * @copyright           TECCO Software Entwicklung AG
 *
 *=========================================================================*
 *=========================================================================*/


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.lang.*;

import corso.lang.*;


public class Flugzeug
    extends JFrame implements ActionListener, WindowListener
{
    // GUI
    private JLabel flugNrLabel;
    private TextField flugNrTextField; 

    private JButton landenButton;
    private JButton startenButton;
    private JButton fertigButton;
    private JButton exitButton;

    private TextField textFieldOben1;

    private JTextArea messageTextArea;
    private JScrollPane messageScrolli;

    private Container container;

    // Flughafen
    private FlughafenInfo flughafenInfo;
    private int nLandebahnen;
    private String flughafenName;
    private CorsoVarOid towerOid;
    private Vector LandebahnOids;

    // CORSO
    private CorsoConnection con;

    // Flugzeug
    private String zustand = "AM_BODEN"; // oder IN_DER_LUFT, LANDEND, STARTEND
    private CorsoVarOid actualLandebahnOid;
    private int actualLandebahnNr;
    private String flugzeugID;


    /**====================================================================* 
     * constructor
     *=====================================================================*/  
    public Flugzeug (String flughafenName, String flugzeugID)  
    {
        this.flughafenName = new String (flughafenName);
        this.flugzeugID = flugzeugID;
        System.out.println (nLandebahnen + " Landebahnen");

        container = getContentPane ();
        setTitle ("Flugzeug " + flugzeugID + " @ Flughafen" + flughafenName);
        setLocation (0, 0);
        setSize (600, 300);  
        container.setLayout (new GridLayout (2, 1));

        JPanel panelOben = new JPanel ();
        panelOben.setLayout (new GridLayout (3, 1));

        textFieldOben1 = new TextField ();
        textFieldOben1.setText ("AM BODEN");
        textFieldOben1.setFont (new Font (null, Font.PLAIN, 24));// null = use default font name

        JPanel panelOben2 = new JPanel ();
        panelOben2.setLayout (new GridLayout (1, 2));

        
        /*
        //---------------------------
        // FlugNr Label und TextField
        //---------------------------
        JPanel panel = new JPanel ();
        panel.setLayout (new GridLayout (1, 2));

        flugNrLabel = new JLabel ("FlugInformation:");
        flugNrTextField = new TextField ("");

        panel.add (flugNrLabel);
        panel.add (flugNrTextField);

        panelOben2.add (panel);
        */

        //---------------
        // STARTEN BUTTON
        //---------------
        startenButton = new JButton ();
        startenButton.setText ("STARTEN");
        startenButton.setFont (new Font (null, Font.BOLD, 24));  // null = use default font name
        panelOben2.add (startenButton);
        startenButton.addActionListener (new java.awt.event.ActionListener()
        {
            public void actionPerformed (ActionEvent e)
                {
                    startenButton_actionPerformed (e);
                }
        });


        //---------------
        // LANDEN BUTTON
        //---------------
        landenButton = new JButton ();
        landenButton.setText ("LANDEN");
        landenButton.setFont (new Font (null, Font.BOLD, 24));   // null = use default font name
        panelOben2.add (landenButton);
        landenButton.addActionListener (new java.awt.event.ActionListener()
        {
            public void actionPerformed (ActionEvent e)
                {
                    landenButton_actionPerformed (e);
                }
        });
               
        
        //---------------
        // FERTIG BUTTON
        //---------------
        fertigButton = new JButton ();
        fertigButton.setText ("FERTIG");
        fertigButton.setFont (new Font (null, Font.BOLD, 24));   // null = use default font name
        fertigButton.addActionListener (new java.awt.event.ActionListener()
        {
            public void actionPerformed (ActionEvent e)
                {
                    fertigButton_actionPerformed (e);
                }
        });


        /*
        //---------------
        // EXIT BUTTON
        //---------------
        exitButton = new JButton ();
        exitButton.setText ("EXIT");
        panelOben2.add (exitButton);
        exitButton.addActionListener (new java.awt.event.ActionListener()
        {
            public void actionPerformed (ActionEvent e)
                {
                    exitButton_actionPerformed (e);
                }
        });
        */


        panelOben.add (textFieldOben1);
        panelOben.add (panelOben2);
        panelOben.add (fertigButton);


        container.add (panelOben);

               
        //-------------
        // message area
        //-------------
        messageTextArea = new JTextArea ();
        messageTextArea.setFont (new Font (null, Font.PLAIN, 20));       // null = use default font name

        messageScrolli = new JScrollPane ();
        messageScrolli.getViewport ().add (messageTextArea);

        container.add (messageScrolli);
               
        

        addWindowListener (this);   
        setVisible (true); 


        //-----------------
        // connect zu CORSO
        //-----------------
        con = new CorsoConnection ();
        try
        {
            con.connect (CourseUtil.USERNAME,
                         CourseUtil.PASSWORD,
                         new CorsoStrategy (CourseUtil.STRATEGY),
                         CourseUtil.AID,
                         "",
                         CourseUtil.SITE,
                         CourseUtil.DOMAIN,
                         CourseUtil.PORT);

            msg ("Connect ok");
        }
        catch (Exception e)
        {
            System.out.println ("Exception: " + e);
            e.printStackTrace ();
            System.exit (-3);
        }
        

        //------------------------
        // Flughafen Info einlesen
        //------------------------
        flughafenInfo = new FlughafenInfo (flughafenName, CourseUtil.SITE, 
                                           con);

        towerOid = flughafenInfo.getTowerOid ();
        LandebahnOids = flughafenInfo.getLandebahnenOids ();


        msg ("Flugzeug " + flugzeugID + " ist am Boden und kann starten");
    }



    /**==================================================================== 
     * ACTION EVENT HANDLER functions  
     *=====================================================================*/  
    public void actionPerformed (ActionEvent e) 
    {
        System.out.println ("GUI: actionPerformed: Event Fired: " + 
          e.getActionCommand ());
    }



    /**==================================================================== 
     * further ACTION EVENT HANDLER functions  
     *=====================================================================*/  
    public void windowClosing (WindowEvent e) { System.exit (0); }
    public void windowClosed (WindowEvent e) { System.out.println ("ciao");}  
    public void windowOpened (WindowEvent e) {}   
    public void windowIconified (WindowEvent e) {} 
    public void windowDeiconified (WindowEvent e) {}
    public void windowActivated (WindowEvent e) {}  
    public void windowDeactivated (WindowEvent e) {} 



    //========================================================================
    // STARTEN button pressed
    //=======================================================================
    void startenButton_actionPerformed (ActionEvent e)
    {
        /* String info = flugNrTextField.getText (); */
        String info = flugzeugID;
        System.out.println ("STARTEN BUTTON PRESSED: " + info);
        if (info == null || info.length () == 0)
            return;

        if (! zustand.equals ("AM_BODEN"))
        {
            msg ("Flugzeug ist nicht am Boden; kann nicht starten");
            return;
        }

        msg ("Versuche zu Starten");
        CorsoVarOid oid;
        Landebahn landebahn;

        try
        {
                for (int i = 0; i < LandebahnOids.size (); i++)
                {
                    oid = (CorsoVarOid) LandebahnOids.get (i);
                    msg ("Probiere Ladebahn " + i + "; OID = " + oid);
                    CorsoTopTransaction tx = con.createTopTransaction ();
                    landebahn = new Landebahn (oid, tx);
                    if (! (landebahn.getStatus ()).equals (CourseUtil.FREI))
                    {
                        // Landebahn ist nicht frei
                        msg ("Ladebahn " + i + " ist besetzt von " +
                             landebahn.getFlugNr () + "/" + 
                             landebahn.getStatus ());
                        tx.abort ();
                        continue;
                    }
                    else
                    {
                        // Landebahn ist frei
                        msg ("Landebahn ist frei");
                        towerOid.setTimeStamp (0);
                        String val = towerOid.readString (
                            tx, CorsoConnection.INFINITE_TIMEOUT);
                        msg ("Tower Info = " + val);
                        if (! val.equals (CourseUtil.GEOEFFNET))
                        {
                            // Tower nicht OK
                            msg ("Flughafen gesperrt");
                            tx.abort ();
                            continue;
                        }
                        else
                        {
                            // Tower OK
                            try
                            {
                                // schreibe meine Info in Landebahn
                                Landebahn lb = new Landebahn (
                                    CourseUtil.START, 
                                    /* flugNrTextField.getText () */
                                    flugzeugID); 
                                oid.writeShareable (lb, tx);
                                
                                tx.commit (CorsoConnection.INFINITE_TIMEOUT);
                                
                                /* flugNrTextField.setText (""); */
                                msg ("Erfolgreich gestartet");

                                zustand = new String ("STARTEND");
                                actualLandebahnOid = oid;
                                actualLandebahnNr = i;

                                textFieldOben1.setText ("STARTEND AUF BAHN " + i);

                                return;  // alles ok
                            }
                            catch (CorsoException e3)
                            {
                                msg ("Darf jetzt nicht starten");
                                continue;
                            }
                        }
                    }
                }
                // msg ("ich probier's in ein paar Sekunden " + 
                //      "nocheinmal...");
                // @@@ wait
                msg ("bitte nocheinmal probieren!!");
                return;
        
        }
        catch (Exception e6)
        {
            System.out.println ("Exception = " + e6);
            ;  // error
        }
    }



    //========================================================================
    // LANDEN button pressed
    //=======================================================================
    void landenButton_actionPerformed (ActionEvent e)
    {
        /* String info = flugNrTextField.getText (); */
        String info = flugzeugID;
        System.out.println ("LANDEN BUTTON PRESSED:" + info);
        if (info == null || info.length () == 0)
            return;

        if (! zustand.equals ("IN_DER_LUFT"))
        {
            msg ("Flugzeug ist nicht in der Luft; kann nicht landen\n");
            return;
        }

        msg ("Versuche zu Landen");
        CorsoVarOid oid;
        Landebahn landebahn;

        try
        {
                for (int i = 0; i < LandebahnOids.size (); i++)
                {
                    oid = (CorsoVarOid) LandebahnOids.get (i);
                    msg ("Probiere Ladebahn " + i + "; OID = " + oid);
                    CorsoTopTransaction tx = con.createTopTransaction ();
                    landebahn = new Landebahn (oid, tx);
                    if (! (landebahn.getStatus ()).equals (CourseUtil.FREI))
                    {
                        // Landebahn ist nicht frei
                        msg ("Ladebahn " + i + " ist besetzt von " +
                             landebahn.getFlugNr () + "/" + 
                             landebahn.getStatus ());
                        tx.abort ();
                        continue;
                    }
                    else
                    {
                        // Landebahn ist frei
                        msg ("Landebahn ist frei");
                        towerOid.setTimeStamp (0);
                        String val = towerOid.readString (
                            tx, CorsoConnection.INFINITE_TIMEOUT);
                        msg ("Tower Info = " + val);
                        if (! val.equals (CourseUtil.GEOEFFNET))
                        {
                            // Tower nicht OK
                            msg ("Flughafen gesperrt");
                            tx.abort ();
                            continue;
                        }
                        else
                        {
                            // Tower OK
                            try
                            {
                                // schreibe meine Info in Landebahn
                                Landebahn lb = new Landebahn (
                                    CourseUtil.LANDUNG, 
                                    /* flugNrTextField.getText () */
                                    flugzeugID); 
                                oid.writeShareable (lb, tx);
                                
                                tx.commit (CorsoConnection.INFINITE_TIMEOUT);
                                
                                /* flugNrTextField.setText (""); */
                                msg ("Erfolgreich gelandet");

                                zustand = new String ("LANDEND");
                                actualLandebahnOid = oid;
                                actualLandebahnNr = i;

                                textFieldOben1.setText ("LANDEND AUF BAHN " + i);

                                return;  // alles ok
                            }
                            catch (CorsoException e3)
                            {
                                msg ("Darf jetzt nicht landen");
                                continue;
                            }
                        }
                    }
                }
                // msg ("ich probier's in ein paar Sekunden nocheinmal...");
                // @@@ wait
                msg ("bitte nocheinmal probieren!!");
                return;
 
        }
        catch (Exception e6)
        {
            System.out.println ("Exception = " + e6);
            ;  // error
        }
    }



    //========================================================================
    // FERTIG button pressed
    //=======================================================================
    void fertigButton_actionPerformed (ActionEvent e)
    {
        System.out.println ("FERTIG BUTTON PRESSED");

        if (zustand.equals ("STARTEND") || zustand.equals ("LANDEND"))
        {
            try
            {
                Landebahn lb = new Landebahn (CourseUtil.FREI, "");
                actualLandebahnOid.writeShareable (
                   lb, CorsoConnection.INFINITE_TIMEOUT);
                msg ("Landebahn " + actualLandebahnNr + " freigegeben");
            }
            catch (Exception e8)
            {
                System.out.println ("Exception = " + e8);
                return;
            }

            if (zustand.equals ("STARTEND"))
            {
                zustand = new String ("IN_DER_LUFT");
                textFieldOben1.setText ("IN DER LUFT");
            }
            else
            {
                zustand = new String ("AM_BODEN");
                textFieldOben1.setText ("AM BODEN");
            }
        }
        else
            msg ("Flugzeug ist weder startend noch landend");

        /* flugNrTextField.setText (""); */
    }



    //========================================================================
    // EXIT button pressed
    //=======================================================================
    void exitButton_actionPerformed (ActionEvent e)
    {
        System.out.println ("EXIT BUTTON PRESSED: bye bye");
        System.exit (0);
    }



    //===================================================================== 
    // message
    //===================================================================== 
    private void msg (String m)
    {
        messageTextArea.append (m);
        messageTextArea.append ("\n");        
    }
    
 
    /**==================================================================== 
     * MAIN
     *=====================================================================*/  
    public static void main (String [] args)
    {
        if (args.length != 2)
        {
            System.out.println ("CALL: Flugzeug <FlugzeugID> <FlughafenName>");
            System.exit (-1);
        }

        new Flugzeug (args[1], args[0]);
    }
}



/**========================================================================*
 *=========================================================================*
 * EOF Flugzeug.java
 *=========================================================================*
 *=========================================================================*/
